var combinationSum = function (candidates, target) {
    // 排除比target大的数
    candidates = candidates.filter(value => {
        if (value <= target) {
            return value;
        }
    })
    var ans = [];
    // 从小到大排序
    candidates.sort((a, b) => a - b);
    dfs(candidates, 0, 0, target, [])
    return ans;

    function dfs(candidates, startIndex, currSum, target, tempArr) {
        for (let i = startIndex; i < candidates.length; i++) {
            // 如果和正好等于target
            if (currSum + candidates[i] == target) {
                // 将该元素推入tempArr
                tempArr.push(candidates[i])
                // 将这些数放入一个数组 并 推入ans
                ans.push([...tempArr])
                tempArr.pop()
                return
                // 如果当前的和currSum + 下一个元素小于target
            } else if (currSum + candidates[i] < target) {
                // 将该元素推入tempArr
                tempArr.push(candidates[i])
                // 进行递归
                dfs(candidates, i, currSum + candidates[i], target, tempArr)
                // 回收刚推入tempArr的元素
                tempArr.pop()
            } else {
                return
            }
        }
    }
};